Skip to content

Linux 多版本程序管理:update-alternatives ​

同一台 Linux 机器上,不同项目对同一程序的要求可能不同:老工程要 cmake 3.16,新工程要 3.20。Debian 系发行版自带的 update-alternatives 就是为此设计的——把多个版本的同一程序注册到一个统一的命令名下,按优先级决定默认版本,一条命令交互切换。本文以管理两个 cmake 版本为例,覆盖注册、切换、验证的完整流程。适合需要在系统级共存多个工具版本的开发者。

工作原理 ​

update-alternatives 维护一条两级符号链接链:/usr/bin/cmake 指向 /etc/alternatives/cmake,后者再指向实际程序路径(如 ~/opt/cmake-3.20.0/bin/cmake)。切换版本只是重指这条链,所有通过 /usr/bin/cmake 调用的程序(包括 ctest、cpack 等同目录工具)自动跟随,系统级生效、对所有用户可用。

注册多个版本 ​

bash
sudo update-alternatives --install /usr/bin/cmake cmake ~/opt/cmake-3.16.3/bin/cmake 20
sudo update-alternatives --install /usr/bin/cmake cmake ~/opt/cmake-3.20.0/bin/cmake 10

四个参数依次是:链接路径(统一的命令入口)、名称(标识这组备选)、实际程序路径、优先级。优先级数字越大越优先,自动模式下系统选择优先级最高的版本——上面的例子里默认版本是 3.16.3。

切换版本 ​

bash
sudo update-alternatives --config cmake

交互式选择:

There are 2 choices for the alternative cmake (providing /usr/bin/cmake).

  Selection    Path                                   Priority   Status
------------------------------------------------------------
* 0            /home/user/opt/cmake-3.16.3/bin/cmake   20        auto mode
  1            /home/user/opt/cmake-3.16.3/bin/cmake   20        manual mode
  2            /home/user/opt/cmake-3.20.0/bin/cmake   10        manual mode

Press <enter> to keep the current choice[*], or type selection number:

输入编号回车即可切换。这里有两种模式值得区分:

  • auto mode(编号 0):跟随优先级自动选择,注册新版本后默认指向可能变化;
  • manual mode(编号 1、2):固定使用选定版本,不再随优先级变动。

直接回车保持当前选择不变。

验证 ​

bash
cmake --version

输出即当前选中的版本。切换后无需重新登录或刷新缓存。

适用边界 ​

update-alternatives 适合 cmake、gcc、python 这类「一个命令入口、多版本共存」的系统程序。它的局限同样明显:按命令全局切换,不能按项目自动选择版本。如果管理的是 Node.js、Python 这类有专用版本管理器(nvm、Volta、pyenv 等)的运行时,且需要进入项目目录自动切换,用专用工具更合适;系统级、手动切换的场景,update-alternatives 足够且零依赖。

最近更新

基于 VitePress 构建